package com.controller;

import com.bean.ShoppingCart;
import com.common.Result;
import com.service.ShoppingCartService;
import com.utils.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/shopping-carts")
public class ShoppingCartController {
    @Autowired
    private ShoppingCartService shoppingCartService;

    /**
     * 根据购物车项 ID 获取购物车项信息的接口
     * @param cartId 购物车项的唯一标识
     * @return 封装了查询结果的通用结果对象，包含状态码、消息和数据
     */
    @GetMapping("/{cartId}")
    public Result<ShoppingCart> getShoppingCartById(@PathVariable Integer cartId) {
        // 调用 Service 层方法查询购物车项信息
        ShoppingCart shoppingCart = shoppingCartService.getShoppingCartById(cartId);
        if (shoppingCart != null) {
            // 如果查询到购物车项信息，返回成功结果
            return Result.success(shoppingCart);
        } else {
            // 如果未查询到购物车项信息，返回失败结果
            return Result.fail("购物车项不存在");
        }
    }

    /**
     * 分页模糊查询用户的购物车信息的接口
     * @param userId 用户的唯一标识
     * @param keyword 模糊查询关键字，可用于匹配书籍标题、作者等信息
     * @param pageNum 当前页码
     * @param pageSize 每页记录数
     * @return 封装了查询结果的通用结果对象，包含状态码、消息和分页后的购物车项列表
     */
    @GetMapping("/user/{userId}")
    public Result<PageInfo<ShoppingCart>> getShoppingCartsByUserIdWithKeyword(@PathVariable Integer userId,
                                                                              @RequestParam(required = false) String keyword,
                                                                              @RequestParam(defaultValue = "1") int pageNum,
                                                                              @RequestParam(defaultValue = "10") int pageSize) {
        // 调用 Service 层方法进行分页模糊查询
        PageInfo<ShoppingCart> pageInfo = shoppingCartService.getShoppingCartsByUserIdWithKeyword(userId, keyword, pageNum, pageSize);
        // 返回成功结果
        return Result.success(pageInfo);
    }

    /**
     * 插入新的购物车项信息的接口
     * @param shoppingCart 包含新购物车项信息的对象
     * @return 封装了插入结果的通用结果对象，包含状态码、消息和插入是否成功的标志
     */
    @PostMapping
    public Result<Boolean> insertShoppingCart(@RequestBody ShoppingCart shoppingCart) {
        // 调用 Service 层方法插入新的购物车项信息
        boolean result = shoppingCartService.insertShoppingCart(shoppingCart);
        if (result) {
            // 如果插入成功，返回成功结果
            return Result.success(true);
        } else {
            // 如果插入失败，返回失败结果
            return Result.fail("插入购物车项失败");
        }
    }

    /**
     * 根据购物车项 ID 更新购物车项信息的接口
     * @param shoppingCart 包含要更新的购物车项信息的对象，其中 cartId 用于定位记录
     * @return 封装了更新结果的通用结果对象，包含状态码、消息和更新是否成功的标志
     */
    @PutMapping
    public Result<Boolean> updateShoppingCart(@RequestBody ShoppingCart shoppingCart) {
        // 调用 Service 层方法更新购物车项信息
        boolean result = shoppingCartService.updateShoppingCart(shoppingCart);
        if (result) {
            // 如果更新成功，返回成功结果
            return Result.success(true);
        } else {
            // 如果更新失败，返回失败结果
            return Result.fail("更新购物车项失败，购物车项可能不存在");
        }
    }

    /**
     * 根据购物车项 ID 删除购物车项信息的接口
     * @param cartId 要删除的购物车项的唯一标识
     * @return 封装了删除结果的通用结果对象，包含状态码、消息和删除是否成功的标志
     */
    @DeleteMapping("/{cartId}")
    public Result<Boolean> deleteShoppingCartById(@PathVariable Integer cartId) {
        // 调用 Service 层方法删除购物车项信息
        boolean result = shoppingCartService.deleteShoppingCartById(cartId);
        if (result) {
            // 如果删除成功，返回成功结果
            return Result.success(true);
        } else {
            // 如果删除失败，返回失败结果
            return Result.fail("删除购物车项失败，购物车项可能不存在");
        }
    }
}